package com.guomao.routing;

import com.guomao.util.ConnectionUtil;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

/**
 * 生产者类
 * 该类用于创建连接、通道，声明交换机和队列，并绑定队列到交换机，最后发送消息
 */
public class Producer {

    /**
     * 主方法，程序入口
     * @param args 命令行参数
     * @throws Exception 可能抛出的异常
     */
    public static void main(String[] args) throws Exception {

        // 获取连接
        Connection connection = ConnectionUtil.getConnection();

        // 创建通道
        Channel channel = connection.createChannel();

        // 定义交换机名称
        String exchangeName = "test_direct";

        // 创建交换机
        // 参数说明：交换机名称、交换机类型(DIRECT)、是否持久化、是否自动删除、是否内部、其他参数
        channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT, true, false, false, null);

        // 创建队列名称
        String queue1Name = "test_direct_queue1";
        String queue2Name = "test_direct_queue2";

        // 声明（创建）队列
        // 参数说明：队列名称、是否持久化、是否独占、是否自动删除、其他参数
        channel.queueDeclare(queue1Name, true, false, false, null);
        channel.queueDeclare(queue2Name, true, false, false, null);

        // 队列绑定交换机
        // 队列1绑定error路由键
        channel.queueBind(queue1Name, exchangeName, "error");

        // 队列2绑定info error warning
// 将队列 queue2Name 与交换器 exchangeName 进行绑定，设置路由键为 "info"
        channel.queueBind(queue2Name, exchangeName, "info");
// 将队列 queue2Name 与交换器 exchangeName 进行绑定，设置路由键为 "error"
        channel.queueBind(queue2Name, exchangeName, "error");
// 将队列 queue2Name 与交换器 exchangeName 进行绑定，设置路由键为 "warning"
        channel.queueBind(queue2Name, exchangeName, "warning");

        String message = "日志信息：张三调用了delete方法.错误了,日志级别warning";

        // 发送消息  
//        channel.basicPublish(exchangeName, "error", null, message.getBytes());
        channel.basicPublish(exchangeName, "info", null, message.getBytes());
        System.out.println(message);

        // 释放资源
        channel.close();
        connection.close();

    }

}